package org.layui.login.dao.impl;

import org.layui.login.dao.UserDao;
import org.layui.login.entity.User;
import org.layui.login.util.DbUtil;

import java.sql.*;

/**
 * @author ZQX
 * @date 2024-12-02
 */
public class UserDaoImpl implements UserDao {
    @Override
    public User selectUserByName(String name) {
        User user = null ;



        // 第一：定义操作数据库的 SQL 语句
        String sql = "select * from users where username=?";

        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection();


        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            // 第三：使用连接对象，获取语句对象(PreparedStatement)，并预编译SQL语句
            pstmt = conn.prepareStatement(sql);

            // 第四：设置数据
            // 语法：语句对象.setXxx(问号占位符索引,数据) ;
            pstmt.setString(1, name);

            // 第五：执行SQL语句，并接收返回结果
            // 语句对象.executeUpdate() -> 增,删,改	   ->  返回的是受影响的记录数
            // 语句对象.executeQuery()  -> 查			-> 	返回的是结果集(ResultSet)
            rs = pstmt.executeQuery();

            // 第六：对结果进行处理
            // 遍历结构集各行各列的数据，封装到相关的实体对象或集合
            // 判断有没有数据:结果集对象.next()
            // 获取结果集的数据:
            // 结果集对象.getXxx(查询数据的索引) ;
            // 结果集对象.getXxx(查询数据的字段名称) ;

            // 1.判断有没有数据 - 返回 true 表示当前查询有返回数据
            if (rs.next()) {
                // 2.如果查询到数据，则实例化用户对象 - 空
                user = new User() ;

                // 3.获取结果集的数据 - 各列数据 - 结果集对象.getXxx(查询数据的索引) ;
                int userId = rs.getInt(1);
                String username = rs.getString(2);
                String password = rs.getString(3);
                String level = rs.getString(4);
                String image = rs.getString(5);
                String phone = rs.getString(6);
                String email = rs.getString(7);
                // java.sql.Timestamp : 年月日时分秒
                // java.sql.Date : 年月日
                // java.util.Date 是 java.sql.* 的父类
                Timestamp registerTime = rs.getTimestamp(8);
                int status = rs.getInt(9);



                // 4.封装到实体对象返回 - 实体对象.setXxx(数据)
                user.setId(userId);
                user.setUsername(username);
                user.setPassword(password);
                user.setLevel(level);
                user.setImage(image);
                user.setPhone(phone);
                user.setEmail(email);
                user.setRegisterTime(registerTime);
                user.setStatus(status);
            }


        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 第七：关闭对象
            DbUtil.close(rs, pstmt, conn);
        }

        return user;
    }
}
